package cn.dduan.fool.callable;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 实现 Callable 接口（JDK8新特性）
 * <p>
 * 优点：可以获取线程的返回值
 * <p>
 * 缺点：在获取t线程执行结果的时候，当前线程受阻塞，效率较低
 *
 * @author dduan
 * @version 1.0
 * @date 2023/3/17
 */
@Slf4j
public class MyCallable implements Callable {

    @Override
    public Object call() throws Exception {
        // 线程执行一个任务，执行之后可能会有一个执行结果
        System.out.println("call method begin");
        Thread.sleep(1000 * 10);
        System.out.println("call method end!");
        int a = 100;
        int b = 200;
        // 自动装箱(300结果变成Integer)
        return a + b;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 第一步：创建一个“未来任务类”对象。
        // 参数非常重要，需要给一个Callable接口实现类对象。
        FutureTask task = new FutureTask(new MyCallable());
        Thread t = new Thread(task);
        t.start();

        Object obj = task.get();
        log.info("获取线程返回值：{}", JSON.toJSON(obj));
        /**
         * 1、obj.wait()：让活动在当前对象的线程无限等待（释放之前占有的锁）
         * 2、obj.notify()：唤醒当前对象正在等待的线程（只提示唤醒，不会释放锁）
         * 3、obj.notifyAll()：唤醒当前对象全部正在等待的线程（只提示唤醒，不会释放锁）
         */
    }
}
